/**
 * sukai
 * 保存数据
 */

#ifndef IIMTDRIVERCPP_DATA_H
#define IIMTDRIVERCPP_DATA_H

//#include "plc_data.h"
#include <QString>
#include <QList>
//连接上机械臂，机械臂返回的数据
struct IIMT_Data{
    int MsgSize;//121
    double Time;
    double q_target[6];
    double qd_target[6];
    double qdd_target[6];
    double I_target[6];
    double M_target[6];
    //当前关节角度
    double q_actual[6];//关节角度
    double qd_actual[6];
    double I_actual[6];
    double I_control[6];
    //当前工具位置
    double Tool_vector_actual[6];  //位置+姿态
    double TCP_speed_actual[6];
    double TCP_force[6];
    double Tool_vector_target[6];
    double TCP_speed_target[6];
    double Digital_input_bits;
    double Motor_temperatures[6];
    double Controller_Timer;
    double Test_value;
    double Robot_Mode;
    double Joint_Modes[6];
    double Safety_Mode;
    double Buffer1[6];
    double Tool_Accelerometer_values[3];
    double Buffer2[6];
    double Speed_scaling;
    double Linear_momentum_norm;
    double Buffer3;
    double Buffer4;
    double V_main;
    double V_robot;
    double I_robot;
    double V_actual[6];
    double Digital_outputs;
    //机械臂状态：1 空闲  2 工作
    double Program_state;
    double Elbow_position[3];
    double Elbow_velocity[3];
};

//枚举
enum MOVETYPE{
    MOVEJ,
    MOVEL,
    MOVEP,
    MOVEC,
    DIGITAL
};


//指令结构体 waitTime:执行当前这条指令时需要等待的时间 等待时间计算为当前服务器每次返回数据的频率的时间乘以waitTime
// sendtypemsg：发送plc的消息，  digitalStatus:执行该脚本对应夹抓的状态
struct Instruction{
    MOVETYPE movetype;
    //需要向plc发送的协议
    QString sendtypemsg;
    double data[6]{0,0,0,0,0,0};
    double a=0;
    double v=0;
    double t=0;
    double r=0;
    int num=0;
    int status=0;
    int waitTime=1;
    int digitalStatus=0;
};

struct InstructionMoveScript{
    MOVETYPE movetype;
    //需要向plc发送的协议
    QString  sendtypemsg;
    double data[6]{0,0,0,0,0,0};
    //io端口号
    int num=0;
    //io 打开关闭的状态
    int status=0;
    //定时时间
    int waitTime=1;
};

//=======================================================================
//=======================================================================
//[路点数据   数据库：TABLE_OR_ROOM_POSE]
//#pragma pack(1)
struct TestInfo
{
    int Id; //mark标点id号
    QString TargetName; //标点名称
    QString MerchantNumber;//商户编号 客户编号 比如龙源或者某个餐饮店比如海底捞1号店【每家店铺可能包含10台机器人，它们在同一个场景运行所以它们的客户编号都是一致的（方便多机协作）】
    QString MerchantName;//商户名称
    QString MapName; //地图名字
    QString Robotfloor; //路点所在的当前楼层
    QString TypeId; //标点类型  0：普通点 ，3：电梯外 ，4：电梯内 ，7：闸机点 ，8：电梯等待点，11：充电桩点，20：狭窄区等待点，76：减速点
    QString MarkNum; //标点编码；存在多个充电座需要通过充电装编号来定位是那个重点装充电； 电梯编码：通过给电梯编码发送指令控制电梯
    QString X;// 标点x坐标
    QString Y;//标点y坐标
    QString QZ;//标点QZ 四元素
    QString QW;//标点QW 四元素
    QString YAW;//标点欧拉角 z
    QString Status;//当前目标点状态 2:在该目标点 1：其它机器人正在前往该目标点 ; 0：该目标点空闲，其它机器人可以前往
    QString Command; //到目的地后需要 tcp 发送这条消息出去操作其它设备，比如机械臂
    QString CommandStatus;//是否启用 Command 发送tcp命令，-1：不发送Command； 1：发送Command；
};


//【字典数据  数据库 TABLE_DICTIONARES】
//#pragma pack(1)
struct Dictionaries
{
    int Id; //字典id号
    QString TargetName;//名称
    QString Key; //key
    QString Value;//值
    QString Status;//默认 0 状态  0：正常  -1：暂停使用
};

//执行路点任务
//多机调度 多机联动时，把testInfo表对应数据的Status取出来，如果状态为1就 查找TargetName+备用点; 路点数据保存时，对应n个机器人就保存n-1个备用点，保存取餐点
//【路点任务  数据库 TABLE_TASKPOSE】
//#pragma pack(1)
struct TaskPOSE
{
    int Id; //执行路点任务id号
    QString TaskName;//谁发的任务,第几个餐盘下发的任务
    QString RobotNumber; //自研底盘机器人编号： longyuan_wt_00001；思岚机器人编号 SLAMWARE-812370； WT5LS103194： 云迹 机器人编号 ；
    QString MapName; //地图名字
    QString Robotfloor; //路点所在的当前楼层
    QString Controller; //控制其它操作,比如电梯，喷雾消毒
    QString Order;//执行顺序
    QString TargetName; //路点名称
    QString MerchantNumber;//商户编号 客户编号 比如龙源或者某个餐饮店比如海底捞1号店【每家店铺可能包含10台机器人，它们在同一个场景运行所以它们的客户编号都是一致的（方便多机协作）】
    QString MerchantName;//商户名称
    QString TypeId; //标点类型  0：普通点 ，3：电梯外 ，4：电梯内 ，7：闸机点 ，8：电梯等待点，11：充电桩点，20：狭窄区等待点，76：减速点
    QString MarkNum; //标点编码； 充电桩编码：存在多个充电座需要通过充电装编号来定位是那个重点装充电； 电梯编码：通过给电梯编码发送指令控制电梯
    QString X;// 标点x坐标
    QString Y;//标点y坐标
    QString QZ;//标点QZ 四元素
    QString QW;//标点QW 四元素
    QString YAW;//标点欧拉角 z
    QString Status;//当前目标点状态  1：其它机器人正在前往该目标点，或在该目标点 ; 0：该目标点空闲，其它机器人可以前往
    QString TaskStatus;//当前任务状态 0：未开始  1：机器人正在前往该目标点 ; 2:机器人已经到达该点的目标备用点
    QString Time;//插入时间
    QString Command; //到目的地后需要 tcp 发送这条消息出去操作其它设备，比如机械臂
    QString CommandStatus;//是否启用 Command 发送tcp命令，-1：不发送Command； 1：发送Command；
    QString Message;//message： 接收客户端发来的消息，目标到达后完整返回给客户端
    QString SocketObjectName;//记录是哪个客户端发送的命令

};
//定时任务  [ 数据库  TABLE_TASK]
struct Table_Task
{
    int Id;//id唯一号
    QString RobotNumber;//机器人编号 SLAMWARE-812370
    QString Equipment_1;//设备1   //紫外灯消毒是否开启 开启，关闭 Disinfectlamp
    QString Equipment_2;//设备2   喷雾是否开启 开启，关闭 Spray
    QString TargetName;//路点名称 //区域号 Area
    QString StartTime;//开始时间 "202105241657"【格式】精确到分
    QString EndTime;//结束时间 "202105241657"【格式】精确到分
    QString Status;//开始标志 开启，关闭
    //是否正在执行
    QString WorkingStatus;//正在运行 ，停止
};
//虚拟墙  [ 数据库  TABLE_COSTMAPLAYER]
struct CostmapLayer
{
    int Id;//id唯一号
    QString FigureType;//图形类型 point：点 至少1个点数据, line：线 至少2个点数据, polygons:多边形 至少3个点数据
    QString FigureName;
    QString MerchantName;// 商户名称
    QString MerchantNumber;// 商户编号 客户编号 比如龙源或者某个餐饮店比如海底捞1号店【每家店铺可能包含10台机器人，它们在同一个场景运行所以它们的客户编号都是一致的（方便多机协作）】
    QString MapName;// 地图名字
    QString Robotfloor;// 地图楼层
    QString RobotNumber;//自研底盘机器人编号： longyuan_wt_00001；思岚机器人编号 SLAMWARE-812370； WT5LS103194： 云迹 机器人编号 ；
    QString POINT_A_X;// 第一个点位A
    QString POINT_A_Y;// 第一个点位A
    QString POINT_B_X;// 第二个点位B
    QString POINT_B_Y;// 第二个点位B
    QString POINT_C_X;// 第三个点位C
    QString POINT_C_Y;// 第三个点位C
    QString POINT_D_X;// 第四个点位D
    QString POINT_D_Y;// 第四个点位D
};

//到达点位后返回的数据
struct ArriveRobot
{

    QString arriveType;//是否是备用路点 ,string类型-> ture:是备用路点 ;string类型-> fase:不是备用路点
    QString arriveObjectName;// tcp客户端名字->发送的命令
    QString arriveTaskName;// 取第几个托盘,发送/api/markers/insert未传递对应的task将返回 EMPTY
    QString arrivetargetName;// 到达的房间
    QString arriveCommand;//到目的地后需要 tcp 发送这条消息出去操作其它设备，比如机械臂
    QString arriveCommandStatus;//是否启用 Command 发送tcp命令，-1：不发送Command； 1：发送Command；
    QString arriveMessage;//message： 接收客户端发来的消息，目标到达后完整返回给客户端
    QString arriveStatus;//success: 成功 ； aborted：未到达目的地；  preempted：用户取消操作
};

//地图名称
struct MapName
{
    QString mapName;//地图名称
    std::vector<std::string> robotfloors;// 地图名称楼层
};

//健值
struct KeyValue
{
    QString key;//健
    QString value;// 值
   // QMap<QString, QString>  keyValue_map;
 //  std::map<QString, QString> keyValue_map;
};
//机器人信息
struct Robot_info
{

    QString robotNumber;//机器人编号
    QString merchantNumber;//商户编号
    QString merchantName;//商户名称
    QString velspeed; //机器人线速度
    QString angularSpeed; //机器人角速度
    QString ip_address; //机器人热点地址
    QString ip_address_prot; //机器人端口
    QString waitGoalTime; //每个目标点停留的时间 当：waitIsNotGo：-1 时 ； waitGoalTime 无效
    QString waitIsNotGo; // waitIsNotGo = 1：到达目标点后自动运行下一个点， -1：不自动运行下一个点 ； | waitIsNotGo：-1 时 waitGoalTime 无效
    QString enableFlag; // 软急停 电机使能true 电机失能false

};
//接收ui的数据 保存地图
struct SaveGmappingMap
{

    QString status ; //返回状态
    QString error_message;//
    QString mapName;//地图名字
    QString robotfloor ;//地图楼层
};
//发送消息
struct SendMsg
{
    int repeat;//是否循环发送 -1:不循环 1：循环
    QString sendMsg;//需要发送的消息
    int logdFlg;//是否需要记录日志 -1:不记录 1：记录
    QString logdMsg;//需要记录的日志内容
    QString logColor;//需要记录显示日志的颜色 get:绿色 send：红色
};




//接收ui的数据
class TargetName_taskName_ui
{
public:

    int Id;//id
    std::string targetName;
    std::string taskName;
    TargetName_taskName_ui(int id,std::string targetName,std::string taskName)
    {
        this->Id=id;
        this->targetName =targetName;
        this->taskName =taskName;
    }

};




#endif //IIMTDRIVERCPP_DATA_H
